package TCP网络编程;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class 客户端与服务端之间的简单交互连接 {
    //客户端
    @Test
    public void client() throws IOException {
        //1.创建Socket对象，指明服务器端的ip和端口号
        Socket socket = new Socket(InetAddress.getByName("localhost"), 9090);
        //2.获取输出流
        OutputStream ipo = socket.getOutputStream();
        //创建一个输入流，输入一张图片
        FileInputStream fips = new FileInputStream("自拍.jpeg");//将文件从本地发送到客户端
//        FileInputStream fips=new FileInputStream(new File("自拍.jpeg"));
        //3.输出数据
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fips.read(bytes)) != -1) {//将输入流的文件读取到一个字节数组中（以二进制序列保存）
            ipo.write(bytes, 0, len);//将字节数组中的二进制序列，输出到输出流中
        }
        System.out.println("图片传输完成！");
        //关闭客户端输出流,才能执行下面接收服务端的数据
        socket.shutdownOutput();
        //4.接收服务端的数据，并打印到控制端上
        //获取一个输入流
        InputStream is = socket.getInputStream();
        //从输入流中读取数据
        ByteArrayOutputStream baos = new ByteArrayOutputStream();//使用字节数组输出流，会自动将数据保存到它自身的数组中，防止出现乱码
        // 一般用于将输出流的数据打印到屏幕时，才使用这个流
        byte[] bytes1 = new byte[20];
        int len1;
        while ((len1 = is.read(bytes1)) != -1) {
            baos.write(bytes1, 0, len1);
        }
        System.out.println(baos.toString());//打印ByteArrayOutputStream流中的数据到屏幕
        //5.关闭资源
        baos.close();
        is.close();
        fips.close();
        ipo.close();
        socket.close();


    }

    //服务端
    @Test
    public void server() throws IOException {
        //1.创建服务器端口
        ServerSocket ss = new ServerSocket(9090);
        //2.利用accept接收相应端口传输的数据
        Socket kh1 = ss.accept();
        //3.获取输入流,通过Socket的getInputStream()方获取
        InputStream is = kh1.getInputStream();
        //4.指定输出流
        FileOutputStream fos = new FileOutputStream("自拍2.jpeg");
        //5.读入数据
        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            //6.读出数据，保存到本地
            fos.write(bytes, 0, len);
        }
        System.out.println("图片接收完成！");
        //7.给客户端给予反馈
        //获取一个输出流
        OutputStream os = kh1.getOutputStream();
        //在输出流中输出数据
        os.write("你好xclmf，你的照片我已经收到！很帅！".getBytes());

        //8.关闭资源
        os.close();
        fos.close();
        is.close();
        kh1.close();
        ss.close();

    }
}
